# 请不要使用 flask.py 作为应用名称，这会与 Flask 本身发生冲突
# 导入Flask类
from flask import Flask
from markupsafe import escape

# 实例化Flask类：第一个参数时模块或者包的名字，Flask通过这个名字来定位模板和静态文件的位置
app = Flask(__name__)


# 通过route注册路由，绑定路由与视图函数的对应关系
@app.route('/')
def index():
    # web客户端访问根目录，返回下面字符串
    return "Hello Flask Mini App!"


# 对于一些重要的数据，为防止注入攻击，使用escape()函数手动转义，一般会省略，但是特定场合不可忽视
@app.route('/test1/<name>')
def test_1(name):
    return f"Hello {escape(name)}"


# 路由参数
# 格式： 1-默认格式(字符串)：<variable_name>
#       2-使用转换器转换成指定格式 <converter:variable_name>

@app.route('/url1/<test_string_converter>') # only adapter /url1/everything and '/' in string _> False
def url1(test_string_converter):  # <class 'str'> not contain '/'
    print(type(test_string_converter))
    return test_string_converter


@app.route('/url2/<int:count>') # only adapter /url2/int
def url2(count):
    print(type(count))  # <class 'int'>
    return str(count)


@app.route('/url3/<float:maxnum>') # only adapter /url3/float
def url3(maxnum):
    print(type(maxnum))  # <class 'float'>
    return str(maxnum)


@app.route('/url4/<path:subpath>')# only adapter /url4/everything
def url4(subpath):
    print(type(subpath))  # <class 'str'> contain '/'
    return subpath


@app.route('/url5/<uuid:id>')
def url5(id):
    print(type(id))
    return str(id)


# 对于url尾部的‘/’，flask是怎么处理的？
@app.route('/projects/')
def projects():
    return "show projects"


@app.route('/about')
def about():
    return "show about"


"""
对于project路由后面有一个‘/’结尾，感觉像是一个文件夹，当请求/projects时会自动重定向到/projects/
当你再/about后面加上‘/’后就会出现404错误
127.0.0.1 - - [31/Aug/2021 20:55:58] "GET /projects HTTP/1.1" 308 -
127.0.0.1 - - [31/Aug/2021 20:55:58] "GET /projects/ HTTP/1.1" 200 -
127.0.0.1 - - [31/Aug/2021 20:56:12] "GET /about HTTP/1.1" 200 -
这样可以保持 URL 唯一，并有助于搜索引擎重复索引同一页面。
"""
